```mermaid
graph TD
    subgraph "Start & Initialization"
        A[Start] --> B{Load ConfigFile?};
        B --> C[Process Parameters];
        C --> D{Validate Parameters};
        D --> E{"dirty.txt exists?"};
        E -- Yes --> F[Run Cleanup Routine];
        F --> G["Create new dirty.txt"];
        E -- No --> G;
    end

    G --> H{"-InstallDrivers or -CopyDrivers?"};

    subgraph "Pre-Build Preparations"
        H -- Yes --> I{Driver Source?};
        I -- "-DriversJsonPath" --> J[Download Drivers via JSON in Parallel];
        I -- "-Make and -Model" --> K[Download Drivers for specific Make/Model];
        I -- "Local Folder" --> L[Use Existing Drivers in Drivers Folder];
        
        subgraph "ADK & WinPE"
            M[Check for ADK & WinPE Add-on];
            M --> N{Latest Version Installed?};
            N -- No --> O[Uninstall Old & Install Latest ADK/WinPE];
            N -- Yes --> P[Get ADK Path];
            O --> P;
        end

        Q{"-InstallApps?"};
        subgraph "Application & In-VM Content Preparation"
            direction LR
            R[Check for existing downloaded apps];
            R --> S{Download missing WinGet apps};
            S --> T{"-InstallOffice?"};
            T -- Yes --> U[Download ODT & Office content];
            T -- No --> V[Continue];
            U --> V;
            V --> W["Download in-VM updates: Defender, MSRT, etc."];
            W --> X["Create Apps.iso"];
        end
    end

    J --> M;
    K --> M;
    L --> M;
    H -- No --> M;
    P --> Q;
    Q -- Yes --> R;
    X --> Y;
    Q -- No --> Y{"-AllowVHDXCaching?"};

    subgraph "VHDX Management"
        Y -- Yes --> Z[Check for matching cached VHDX];
        Z --> AA{Cache Hit?};
        AA -- Yes --> AB[Use Cached VHDX];
        AA -- No --> AC[Create New VHDX];
        Y -- No --> AC;

        subgraph "VHDX Creation Workflow"
            AC --> AD{ISOPath provided?};
            AD -- No --> AE[Download Windows ESD media];
            AD -- Yes --> AF[Use provided ISO];
            AE --> AG[Create & Partition VHDX];
            AF --> AG;
            AG --> AH[Apply Base Windows Image to VHDX];
            AH --> AI{"Updates specified? (CU, dotNET, etc.)"};
            AI -- Yes --> AJ[Apply Updates to Offline VHDX];
            AJ --> AK[Run Component Cleanup];
            AI -- No --> AK;
            AK --> AL{"Optional Features specified?"};
            AL -- Yes --> AM[Enable Optional Features];
            AL -- No --> AN[Finalize VHDX Setup];
            AM --> AN;
            AN --> AO{"-AllowVHDXCaching?"};
            AO -- Yes --> AP[Optimize and Copy VHDX to Cache];
            AO -- No --> AQ[Continue];
            AP --> AQ;
        end
    end
    
    AB --> BA;
    AQ --> BA{"-InstallApps?"};

    subgraph "FFU Creation"
        subgraph "VM-Based Capture (-InstallApps)"
            direction LR
            BB[Create Hyper-V VM from VHDX];
            BB --> BE["Start VM: Boots to Audit Mode"];
            BE --> BF[Orchestrator runs: Installs apps, syspreps, shuts down];
            BF --> BG[Host optimizes and remounts VHDX];
            BG --> BH["DISM captures FFU directly from host-mounted VHDX"];
        end

        subgraph "Direct VHDX Capture"
            BI[Capture FFU directly from VHDX using DISM];
        end
    end
    
    BA -- Yes --> BB;
    BA -- No --> BI;

    subgraph "Post-Processing & Media Creation"
        BK{"-InstallDrivers?"};
        BK -- Yes --> BL[Mount FFU & Inject Drivers];
        BK -- No --> BM[Continue];
        BL --> BM;
        BM --> BN{"-Optimize?"};
        BN -- Yes --> BO[Optimize FFU using DISM];
        BN -- No --> BP[Continue];
        BO --> BP;
        BP --> BQ{"-BuildUSBDrive?"};
        BQ -- Yes --> BR[Create WinPE Deployment Media];
        BR --> BS["Partition USB Drive(s)"];
        BS --> BT[Copy FFU, Deploy scripts & other assets to USB];
        BQ -- No --> BU[Continue];
        BT --> BU;
    end

    BH --> BK;
    BI --> BK;

    subgraph "Final Cleanup"
        BU --> BV[Cleanup VM, VHDX, temp files];
        BV --> BW["Remove dirty.txt"];
        BW --> BX[End];
    end