private List <ModOption> AnalyzeBainArchive(ModOption archiveModOption)
        {
            ArchiveFile archive = archiveModOption.Archive;
            bool        flex    = archiveModOption.IsFlexArchive;

            if (flex)
            {
                archiveModOption.BaseInstallerPath = archiveModOption.Archive.GetBaseDirectory();
            }
            string bainType = flex ? "FLEX" : "BAIN";

            _backgroundWorker.ReportMessage("Parsing " + bainType + " Options", true);
            List <ModOption> bainOptions = new List <ModOption>();
            List <Tuple <string, ModOption> > bainMap = new List <Tuple <string, ModOption> >();

            // STEP 1. Find BAIN directories and build mod options for them
            foreach (string bainDirectory in archiveModOption.GetInstallerDirectories(!flex))
            {
                string bainOptionName = Path.GetFileName(bainDirectory);
                _backgroundWorker.ReportMessage("Found " + bainType + " Option " + bainOptionName, false);
                ModOption bainOption = new ModOption(bainOptionName, false, true);
                bainMap.Add(new Tuple <string, ModOption>(bainDirectory, bainOption));
                bainOptions.Add(bainOption);
            }

            // STEP 2: Map entries to bain options
            IList <Entry> fileEntries = archive.FileEntries();

            _backgroundWorker.ReportMessage(string.Format("{0}Mapping {1} assets to {2} {3} Options",
                                                          Environment.NewLine, fileEntries.Count, bainOptions.Count, bainType), true);
            foreach (Entry entry in fileEntries)
            {
                MapEntryToBainOption(bainMap, entry, archiveModOption);
            }

            // Return the mod options we built
            _backgroundWorker.ReportMessage("Done.  " + bainOptions.Count + " " + bainType + " Options found.", true);
            return(bainOptions.OrderBy(x => x.Name).ToList());
        }