private Map<Function, Map<Long, Map<Integer, Object>>> createFunctionsMap(
			Collection<VTAssociation> associations, boolean source, TaskMonitor monitor)
			throws CancelledException {

		Map<Function, Map<Long, Map<Integer, Object>>> functionsMap =
			new HashMap<>();

		// to keep track of which functions are attempted so only mapped once since there are 
		// multiple pairs with same source function and multiple with the same dest function
		Set<Function> functionsMapAttempted = new HashSet<Function>();

		// make an operand map for each source and destination function in the given associations
		for (VTAssociation association : associations) {
			monitor.checkCancelled();

			Function function = null;
			if (source) {
				function = getSourceFunction(association);
			}
			else {
				function = getDestFunction(association);
			}
			if (function == null) {
				continue;
			}

			if (functionsMapAttempted.contains(function)) {
				continue;
			}

			functionsMapAttempted.add(function);

			// create offset/operand info map for the given source function 
			Map<Long, Map<Integer, Object>> map =
				mapFunctionScalarAndAddressOperands(function, monitor);

			// only keep the ones with operand info to map
			if (map != null) {
				functionsMap.put(function, map);
			}
		}
		return functionsMap;
	}
Create an operand map for each source or destination function in the given associations
@param associations The collection of associations (src/dest function pairs)
@param source if true use the source function, if false use the destination function
@param monitor the task monitor
@return the map of functions to their operand maps
@throws CancelledException if cancelled
Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/actions/AutoVersionTrackingTask.java