public MessageLog read(Program program, TaskMonitor monitor)
			throws IOException, AddressFormatException {

		if (mgrs == null || program != this.program) {
			this.program = program;
			addManagers();
		}
		if (df == null) {
			SarifIO io = new SarifGsonIO();
			sarif = getSarif(io);
			controller = new SarifController(this);
		}
		controller.setProgram(program);
		df = new SarifDataFrame(sarif, controller, false);

		Map<String, List<Map<String, Object>>> tableResults = getDataFrame().getTableResultsAsMap();

		readResults(monitor, options, tableResults);

		createDefaultTree(program, options);

		// if instructions were imported, then remove the "needs analyzed" property
		if (options.isInstructions()) {
			GhidraProgramUtilities.markProgramAnalyzed(program);
		}

		return null;
	}
Reads from the underlying SARIF file and populates the specified program.

@param program the program to load the SARIF into
@param monitor the task monitor
@param options the SARIF options, which features to load and to ignore
@return the message log containing any warning/error messages
@throws SAXException           if an SARIF error occurs
@throws IOException            if an I/O occurs
@throws AddressFormatException if an invalid address is specified in the
                               SARIF
Ghidra/Features/Sarif/src/main/java/sarif/managers/ProgramSarifMgr.java