private JPanel createWorkPanel() {
		JPanel mainPanel = new JPanel(new BorderLayout());

		tableModel = new RandomForestTableModel(plugin.getTool(), rowObjects);
		GThreadedTablePanel<RandomForestRowObject> evalPanel =
			new GThreadedTablePanel<>(tableModel);
		GTable modelStatsTable = evalPanel.getTable();
		modelStatsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		evalPanel.setBorder(BorderFactory.createTitledBorder(MODEL_STATISTICS));
		mainPanel.add(evalPanel, BorderLayout.CENTER);

		DockingAction applyAction = new ActionBuilder(APPLY_MODEL_ACTION_NAME, plugin.getName())
				.description("Apply Model to Source Program")
				.popupWhen(c -> trainingSource != null)
				.enabledWhen(c -> tableModel.getLastSelectedObjects().size() == 1)
				.popupMenuPath(APPLY_MODEL_MENU_TEXT)
				.inWindow(ActionBuilder.When.ALWAYS)
				.onAction(c -> {
					searchTrainingProgram(tableModel.getLastSelectedObjects().get(0));
				})
				.build();
		addAction(applyAction);

		DockingAction applyToAction =
			new ActionBuilder(APPLY_MODEL_TO_ACTION_NAME, plugin.getName())
					.description("Choose Program and Apply Model to it")
					.popupWhen(c -> trainingSource != null)
					.enabledWhen(c -> tableModel.getLastSelectedObjects().size() == 1)
					.popupMenuPath(APPLY_MODEL_TO_MENU_TEXT)
					.inWindow(ActionBuilder.When.ALWAYS)
					.onAction(c -> {
						searchOtherProgram(tableModel.getLastSelectedObjects().get(0));
					})
					.build();
		addAction(applyToAction);

		DockingAction checkAction = new ActionBuilder(DEBUG_MODEL_ACTION_NAME, plugin.getName())
				.description("Show Test Set Errors")
				.popupWhen(c -> trainingSource != null)
				.enabledWhen(c -> tableModel.getLastSelectedObjects().size() == 1)
				.popupMenuPath(DEBUG_MODEL_MENU_TEXT)
				.inWindow(ActionBuilder.When.ALWAYS)
				.onAction(c -> {
					showTestErrors(tableModel.getLastSelectedObjects().get(0));
				})
				.build();
		addAction(checkAction);

		JPanel paramsPanel = new JPanel();
		paramsPanel.setBorder(BorderFactory.createTitledBorder(DATA_GATHERING_PARAMETERS));
		PairLayout pairLayout = new PairLayout();
		paramsPanel.setLayout(pairLayout);

		JLabel preLabel = new GDLabel(PRE_BYTES_TEXT);
		preLabel.setToolTipText(PRE_BYTES_TIP);
		paramsPanel.add(preLabel);
		preBytesField = new JTextField();
		String preBytes = Preferences.getProperty(PRE_BYTES_PROPERTY, DEFAULT_PRE_BYTES);
		preBytesField.setText(preBytes);
		paramsPanel.add(preBytesField);

		JLabel initialLabel = new GDLabel(INITIAL_BYTES_TEXT);
		initialLabel.setToolTipText(INITIAL_BYTES_TIP);
		paramsPanel.add(initialLabel);
		initialBytesField = new JTextField();
		String initialBytes =
			Preferences.getProperty(INITIAL_BYTES_PROPERTY, DEFAULT_INITIAL_BYTES);
		initialBytesField.setText(initialBytes);
		paramsPanel.add(initialBytesField);

		JLabel factorLabel = new GDLabel(FACTOR_TEXT);
		factorLabel.setToolTipText(FACTOR_TIP);
		paramsPanel.add(factorLabel);
		factorField = new JTextField();
		String factor = Preferences.getProperty(FACTOR_PROPERTY, DEFAULT_FACTOR);
		factorField.setText(factor);
		paramsPanel.add(factorField);

		JLabel maxStartsLabel = new GDLabel(MAX_STARTS_TEXT);
		maxStartsLabel.setToolTipText(MAX_STARTS_TIP);
		paramsPanel.add(maxStartsLabel);
		maxStartsField = new IntegerTextField();
		String maxStarts = Preferences.getProperty(MAX_STARTS_PROPERTY, DEFAULT_MAX_STARTS);
		maxStartsField.setValue(Integer.parseInt(maxStarts));
		paramsPanel.add(maxStartsField.getComponent());

		JLabel contextLabel = new GDLabel(CONTEXT_REGISTER_TEXT);
		contextLabel.setToolTipText(CONTEXT_REGISTER_TIP);
		paramsPanel.add(contextLabel);
		contextRegistersField = new JTextField(DEFAULT_CONTEXT_REGISTERS);
		String cRegs = Preferences.getProperty(CONTEXT_REGISTER_PROPERTY, "");
		if (!StringUtils.isEmpty(cRegs)) {
			contextRegistersField.setText(cRegs);
		}
		paramsPanel.add(contextRegistersField);

		JLabel includeBeforeAndAfterLabel = new JLabel(INCLUDE_PRECEDING_FOLLOWING_TEXT);
		includeBeforeAndAfterLabel.setToolTipText(INCLUDE_PRECEDING_FOLLOWING_TIP);
		includeBeforeAndAfterBox = new JCheckBox();
		String defaultUseBeforeAfter =
			Preferences.getProperty(INCLUDE_PRECEDING_AND_FOLLOWING_PROPERTY, DEFAULT_INCLUDE_PF);
		includeBeforeAndAfterBox.setSelected(Boolean.valueOf(defaultUseBeforeAfter));
		paramsPanel.add(includeBeforeAndAfterLabel);
		paramsPanel.add(includeBeforeAndAfterBox);

		JLabel includeSelectionLabel = new JLabel(INCLUDE_BIT_FEATURES_TEXT);
		includeSelectionLabel.setToolTipText(INCLUDE_BIT_FEATURES_TIP);
		includeBitFeaturesBox = new JCheckBox();
		String defaultIncludeBitFeatures =
			Preferences.getProperty(INCLUDE_BIT_FEATURES_PROPERTY, DEFAULT_INCLUDE_BIT_FEATURES);
		includeBitFeaturesBox.setSelected(Boolean.valueOf(defaultIncludeBitFeatures));
		paramsPanel.add(includeSelectionLabel);
		paramsPanel.add(includeBitFeaturesBox);

		JLabel minFuncLabel = new GDLabel(MIN_FUNC_SIZE_TEXT);
		minFuncLabel.setToolTipText(MIN_FUNC_SIZE_TIP);
		paramsPanel.add(minFuncLabel);
		minimumSizeField = new IntegerTextField();
		String minSize =
			Preferences.getProperty(MIN_FUNC_SIZE_PROPERTY, DEFAULT_MINIMUM_FUNCTION_SIZE);
		minimumSizeField.setValue(Integer.parseInt(minSize));
		minimumSizeField.addChangeListener(e -> {
			updateNumFuncsField();
			updateModulusTable();
		});
		paramsPanel.add(minimumSizeField.getComponent());

		JPanel funcDataPanel = new JPanel();
		pairLayout = new PairLayout();
		funcDataPanel.setLayout(pairLayout);

		JLabel numFuncsLabel = new GDLabel(FUNCTIONS_MEETING_SIZE_TEXT);
		numFuncsLabel.setToolTipText(FUNCTIONS_MEETING_SIZE_TIP);
		funcDataPanel.add(numFuncsLabel);
		numFuncsField = new GDLabel();
		updateNumFuncsField();
		funcDataPanel.add(numFuncsField);

		JLabel restrictLabel = new GDLabel(RESTRICT_SEARCH_TEXT);
		restrictLabel.setToolTipText(RESTRICT_SEARCH_TIP);
		funcDataPanel.add(restrictLabel);
		restrictBox = new JCheckBox();
		funcDataPanel.add(restrictBox);

		JLabel modulusLabel = new GDLabel(ALIGNMENT_MODULUS_TEXT);
		modulusLabel.setToolTipText(ALIGNMENT_MODULUS_TIP);
		funcDataPanel.add(modulusLabel);
		modBox = new GComboBox<>(moduli);
		modBox.setSelectedItem(Long.valueOf(16));
		modBox.addActionListener(e -> updateModulusTable());
		funcDataPanel.add(modBox);

		tableScrollPane = getFuncAlignmentScrollPane();

		funcInfoPanel = new JPanel();
		funcInfoPanel.setLayout(new BorderLayout());
		funcInfoPanel.setBorder(BorderFactory.createTitledBorder(FUNCTION_INFO));
		funcInfoPanel.add(funcDataPanel, BorderLayout.NORTH);
		funcInfoPanel.add(tableScrollPane, BorderLayout.CENTER);

		JPanel infoPanel = new JPanel(new BorderLayout());
		infoPanel.add(paramsPanel, BorderLayout.NORTH);
		infoPanel.add(funcInfoPanel, BorderLayout.CENTER);
		mainPanel.add(infoPanel, BorderLayout.WEST);
		return mainPanel;
	}
Returns the program used to train the models
@return source program
Ghidra/Extensions/MachineLearning/src/main/java/ghidra/machinelearning/functionfinding/FunctionStartRFParamsDialog.java