code: @Override
      public void start() {
          super.start();
  
          PhaseThreeOptions phasecfg = getPhaseConfiguration();
          if (hasOption(EXPAND_NC_LONG_OPT)) {
              phasecfg.setExpandNamedComplexes(true);
          }
          if (hasOption(EXPAND_PF_LONG_OPT)) {
              phasecfg.setExpandProteinFamilies(true);
          }
          if (hasOption(NO_NC_LONG_OPT)) {
              phasecfg.setInjectNamedComplexes(false);
          }
          if (hasOption(NO_PF_LONG_OPT)) {
              phasecfg.setInjectProteinFamilies(false);
          }
          if (hasOption(NO_GS_LONG_OPT)) {
              phasecfg.setInjectGeneScaffolding(false);
          }
          if (hasOption(PHASE3_NO_ORTHOLOGY_LONG_OPTION)) {
              phasecfg.setInjectOrthology(false);
          }
  
          phaseOutput(format("=== %s ===", getApplicationName()));
  
          if (isSkipped()) {
              final StringBuilder bldr = new StringBuilder();
              bldr.append(getApplicationShortName());
              bldr.append(" has been skipped.");
              phaseOutput(bldr.toString());
              return;
          }
  
          // load the resource index for phase III use.
          String resourceIndexURL = sysconfig.getResourceIndexURL();
          try {
              final ResolvedResource resource = cache.resolveResource(
                      ResourceType.RESOURCE_INDEX, resourceIndexURL);
              ResourceIndex.INSTANCE.loadIndex(resource.getCacheResourceCopy());
          } catch (ResourceDownloadError e) {
              failIndex(phasecfg, e.getUserFacingMessage());
          } catch (FileNotFoundException e) {
              failIndex(phasecfg, e.getMessage());
          } catch (XMLStreamException e) {
              failIndex(phasecfg, e.getMessage());
          }
  
          processOutputDirectory();
      }
docs: {@inheritDoc}